package aceim.app.view.page.inputform;
import java.io.File;
import java.util.Calendar;
import aceim.api.dataentity.InputFormFeature;
import aceim.api.dataentity.OnlineInfo;
import aceim.api.dataentity.tkv.FileTKV;
import aceim.api.dataentity.tkv.ListTKV;
import aceim.api.dataentity.tkv.StringTKV;
import aceim.api.dataentity.tkv.TKV;
import aceim.api.dataentity.tkv.ToggleTKV;
import aceim.app.MainActivity;
import aceim.app.R;
import aceim.app.dataentity.ActivityResult;
import aceim.app.dataentity.ProtocolResources;
import aceim.app.dataentity.listeners.IHasFilePicker;
import aceim.app.service.ServiceUtils;
import aceim.app.utils.ViewUtils;
import aceim.app.view.page.Page;
import aceim.app.widgets.bottombar.BottomBarButton;
import aceim.app.widgets.pickers.CalendarPickerListenerBase;
import aceim.app.widgets.pickers.DatePickerListener;
import aceim.app.widgets.pickers.FilePickerListener;
import aceim.app.widgets.pickers.PickerListenerBase.ValuePickedListener;
import aceim.app.widgets.pickers.TimePickerListener;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.RemoteException;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.Spinner;
import android.widget.TextView;
@SuppressLint("InlinedApi")
public class InputFormFeaturePage extends Page implements IHasFilePicker {
private static final LayoutParams LIST_PARAMS = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
private final InputFormFeature mFeature;
private final OnlineInfo mInfo;
private final ProtocolResources mProtocolResources;
private BottomBarButton mRunBtn;
private LinearLayout mContainer;
private OnClickListener mRunClickListener = new OnClickListener() {
@Override
public void onClick(View clicked) {
boolean areMandatoryFieldsFilled = true;
for (int i = 0; i < mFeature.getEditorFields().length; i++) {
TKV tkv = mFeature.getEditorFields()[i];
View v = mContainer.getChildAt(i).findViewById(R.id.value);
if (v instanceof CheckBox) {
tkv.setValue(Boolean.toString(((CheckBox)v).isChecked()));
} else if (v instanceof Spinner) {
tkv.setValue(((Spinner)v).getSelectedItem().toString());
} else {
//FileTKV value is already filled
if (!(tkv instanceof FileTKV)) {
tkv.setValue(((TextView)v).getText().toString().trim());
}
}
if (!checkValueMandatory(tkv, v)) {
v.setBackgroundResource(R.drawable.criteria_bad);
areMandatoryFieldsFilled = false;
}
}
if (!areMandatoryFieldsFilled) {
ViewUtils.showAlertToast(getMainActivity(), android.R.drawable.ic_dialog_alert, R.string.unfilled_mandatory_warning, null);
return;
}
mInfo.getFeatures().putParcelableArray(mFeature.getFeatureId(), mFeature.getEditorFields());
try {
getMainActivity().getCoreService().setFeature(mFeature.getFeatureId(), mInfo);
removeMe();
} catch (RemoteException e) {
getMainActivity().onRemoteException(e);
}
}
};
public InputFormFeaturePage(InputFormFeature feature, OnlineInfo info, ProtocolResources mProtocolResources) {
this.mFeature = feature;
this.mInfo = info;
this.mProtocolResources = mProtocolResources;
}
@Override
public Drawable getIcon(Context context) {
try {
return mProtocolResources.getNativeResourcesForProtocol(context.getPackageManager()).getDrawable(mFeature.getIconId());
} catch (Exception e) {
return context.getResources().getDrawable(R.drawable.logo_corner_small);
}
}
@Override
public String getTitle(Context context) {
return context.getString(R.string.default_key_value_format, mInfo.getProtocolUid(), mFeature.getFeatureName());
}
@Override
protected View createView(LayoutInflater inflater, ViewGroup group, Bundle saved) {
View view = inflater.inflate(R.layout.input_form, null);
mContainer = (LinearLayout) view.findViewById(R.id.container);
mRunBtn = (BottomBarButton) view.findViewById(R.id.run);
mRunBtn.setOnClickListener(mRunClickListener);
for (TKV field: mFeature.getEditorFields()) {
processFormField(inflater, field);
}
return view;
}
private void processFormField(LayoutInflater inflater, TKV field) {
View item;
if (field instanceof FileTKV) {
item = fillDialogItem(inflater, field, new FilePickerListener(field, new InputFormFieldValueListener(field), getMainActivity()));
} else if (field instanceof ToggleTKV) {
item = inflater.inflate(R.layout.options_item_checkbox, null);
CheckBox cb = (CheckBox) item.findViewById(R.id.value);
if (field.getValue() != null) {
cb.setChecked(Boolean.parseBoolean(field.getValue()));
}
} else if (field instanceof ListTKV) {
item = inflater.inflate(R.layout.options_item_list, null);
Spinner spinner = (Spinner) item.findViewById(R.id.value);
ListTKV list = (ListTKV) field;
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getMainActivity(), android.R.layout.simple_spinner_item, android.R.id.text1, list.getChoices());
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
for (int i=0; i<list.getChoices().length; i++) {
if (list.getChoices()[i].equals(list.getValue())) {
spinner.setSelection(i);
break;
}
}
} else if (field instanceof StringTKV) {
StringTKV tkv = (StringTKV) field;
switch (tkv.getContentType()) {
case DATE:
item = fillDialogItem(inflater, field, new DatePickerListener(field, new InputFormFieldValueListener(field), getMainActivity()));
break;
case TIME:
item = fillDialogItem(inflater, field, new TimePickerListener(field, new InputFormFieldValueListener(field), getMainActivity()));
break;
/*case CHECKBOX:
item = inflater.inflate(R.layout.options_item_checkbox, null);
CheckBox cb = (CheckBox) item.findViewById(R.id.value);
boolean b;
if (field.getValue() != null) {
b = Boolean.parseBoolean(field.getValue());
} else {
b = false;
}
cb.setChecked(b);
break;*/
case DOUBLE:
item = fillEditTextItem(R.layout.options_item_double, inflater, field);
break;
case INTEGER:
item = fillEditTextItem(R.layout.options_item_integer, inflater, field);
break;
case PASSWORD:
item = fillEditTextItem(R.layout.options_item_password, inflater, field);
break;
case STRING:
item = fillEditTextItem(R.layout.options_item_text, inflater, field);
break;
default:
item = fillDialogItem(inflater, field, null);
break;
}
} else {
item = fillDialogItem(inflater, field, null);
}
((TextView) item.findViewById(R.id.label)).setText(field.getKey());
item.setLayoutParams(LIST_PARAMS);
item.setTag(field.getKey());
mContainer.addView(item, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
}
private View fillDialogItem(LayoutInflater inflater, TKV field, OnClickListener clickListener) {
View item = inflater.inflate(R.layout.options_item, null);
ImageButton editBtn = (ImageButton) item.findViewById(R.id.edit);
editBtn.setImageResource(android.R.drawable.ic_menu_edit);
if (clickListener != null) {
editBtn.setOnClickListener(clickListener);
} else {
editBtn.setVisibility(View.INVISIBLE);
}
TextView tvalue = (TextView) item.findViewById(R.id.value);
if (field.getValue() != null) {
if (field instanceof FileTKV) {
setFileItemLabelValue(item, field.getValue());
} else if (field instanceof StringTKV) {
StringTKV tkv = (StringTKV) field;
switch (tkv.getContentType()) {
case DATE:
case TIME:
CalendarPickerListenerBase l = (CalendarPickerListenerBase) clickListener;
long timeMillis = Long.parseLong(field.getValue());
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(timeMillis);
tvalue.setText(l.getFormat().format(cal.getTime()));
break;
default:
tvalue.setText(field.getValue());
break;
}
} else if (field instanceof ListTKV) {
//TODO
}
}
return item;
}
private boolean checkValueMandatory(TKV tkv, View v) {
return !tkv.isMandatory() || !TextUtils.isEmpty(tkv.getValue());
}
private View fillEditTextItem(int layoutId, LayoutInflater inflater, final TKV field) {
View item = inflater.inflate(layoutId, null);
final EditText et = ((EditText) item.findViewById(R.id.value));
String value;
if (field.getValue() != null) {
value = field.getValue();
} else {
value = null;
}
et.setText(value);
et.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void afterTextChanged(Editable s) {
field.setValue(et.getText().toString());
}
});
return item;
}
private static void setFileItemLabelValue(View item, String value) {
TextView tvalue = (TextView) item.findViewById(R.id.value);
if (value != null) {
tvalue.setText(new File(value).getName());
} else {
tvalue.setText(null);
}
}
@Override
public void onFilePicked(ActivityResult result, MainActivity activity) {
switch (result.getResultCode()) {
case Activity.RESULT_OK:
for (int i = 0; i < mFeature.getEditorFields().length; i++) {
TKV tkv = mFeature.getEditorFields()[i];
if (ServiceUtils.getRequestCodeForActivity(tkv.getKey().hashCode()) == result.getRequestCode()) {
LinearLayout container = (LinearLayout) getView().findViewById(R.id.container);
View item = container.getChildAt(i);
String filePath = result.getData().getData().getPath();
tkv.setValue(filePath);
setFileItemLabelValue(item, filePath);
}
}
break;
}
}
private final class InputFormFieldValueListener implements ValuePickedListener {
private final TKV tkv;
private InputFormFieldValueListener(TKV tkv) {
this.tkv = tkv;
}
@Override
public void onValuePicked(String value) {
this.tkv.setValue(value);
}
}
/**
* @return the mInfo
*/
public OnlineInfo getOnlineInfo() {
return mInfo;
}
@Override
public String getPageId(){
return Page.getPageIdForInputFormPage(mFeature, mInfo);
}
}